package main

/**
 * @Author: DengLibin
 * @Date: Create in 2023-01-12 11:34:16
 * @Description:
 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

请注意 ，必须在不复制数组的情况下原地对数组进行操作。
*/

/**
 * @Author: DengLibin
 * @Date: Create in 2023-01-12 11:34:29
 * @Description:
 */
func moveZeroes(nums []int) {
	start := 0
	end := 0
	for nums[start] != 0 {
		start++
		if start >= len(nums) {
			return
		}

	}
	end = start
	for end < len(nums) {
		for start >= 0 && nums[start] == 0 {
			start--
		}
		start++
		for end < len(nums) && nums[end] == 0 {
			end++
		}
		end--
		ds := moveNums(start, end, nums)

		start = end + 1
		end = start + ds
	}
}

func moveNums(start, end int, nums []int) int {
	if end == len(nums)-1 {
		return 0
	}
	for i := 0; i < (end-start)+1; i++ {
		if end+i+1 >= len(nums) || nums[end+i+1] == 0 {
			return i
		}
		nums[start+i] = nums[end+i+1]
		nums[end+i+1] = 0
	}
	return end - start
}
